/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package control;
import bcrypt.BCrypt;
import entidad.*;
import frontera.dao.DAO;
import java.util.Collections;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 *
 * @author Nico
 */
public class AdministrarUsuarios extends Administrar<Usuario>{
    
    public AdministrarUsuarios(){
    }
    
    @Override
    protected DAO<Usuario> getDAO() {
        return SIRHApp.getInstance().getDAOUsuario();
    }

    public String crearUsuario(String nombre,String contraseña,Empleado empleadoAsociado){

        String informacionValidacion = validarInformacion(nombre, contraseña, empleadoAsociado);
        
        if ( informacionValidacion.equals("")){
            Usuario nuevoUsuario = new Usuario(nombre, cifrarContraseña(contraseña),empleadoAsociado);
            
            SIRHApp.getInstance().getSistema().agregarUsuario(nuevoUsuario);

            return "";}
        
        return informacionValidacion;

    }

    public boolean eliminarUsuario(int indice){

        Usuario borrUsuario = SIRHApp.getInstance().getSistema().getUsuarios().get(indice);

        return ( SIRHApp.getInstance().getSistema().eliminarUsuario( borrUsuario ) );
    }

    public String actualizarUsuario(Usuario usuarioAntiguo,String contraseña){
        Usuario actUsuario = usuarioAntiguo;

        String informacionValidacion = validarInformacion(actUsuario.getNombre(), contraseña, actUsuario.getEmpleadoAsociado());
        if ( informacionValidacion.equals("")){
            
            Usuario nuevoUsuario = new Usuario(actUsuario.getNombre(), cifrarContraseña(contraseña),actUsuario.getEmpleadoAsociado());

            getDAO().actualizar(actUsuario, nuevoUsuario);

            return "";}
        
        return informacionValidacion;
    }
    
    public boolean eliminarUsuario(Usuario borUsuario) {
        return SIRHApp.getInstance().getSistema().eliminarUsuario(borUsuario);
    }

    public String validarInformacion(String nombre, String contraseña, Empleado empleado){

        if ( !verificarFormatoNombre(nombre) ){
            return ("El nombre no puede poseer caracteres especiales como espacio y símbolos distintos a (._-).");
        }
        
        if ( !verificarLongitudNombre(nombre)){
            return ("El nombre debe tener una longitud mínima de 8 caracteres y máxima de 20.");
        }

        if ( !verificarFormatoContraseña(contraseña)){
            return ("La clave no debe contener caracteres especiales.");
        }

        if ( !verificarLongitudContraseña(contraseña)){
            return ("La clave debe tener una longitud mínima de 8 caracteres y máxima de 20.");
        }

        if ( empleado == null){
            return ("Debe asociar un empleado a este usuario, de otra manera no se podra crear.");
        }

        return("");
    }

    public boolean verificarFormatoNombre(String nombre){
        Pattern patternClave = Pattern.compile("[^A-Za-z0-9._-]");
        Matcher matcherClave = patternClave.matcher(nombre);

        boolean resultado = matcherClave.find();
        return (!resultado);
    }

    public boolean verificarLongitudNombre(String nombre){
        return ( nombre.length() >= 8 && nombre.length() <= 20);
    }

    public boolean verificarFormatoContraseña(String clave){
        Pattern patternClave = Pattern.compile("[^A-Za-z0-9]");
        Matcher matcherClave = patternClave.matcher(clave);

        boolean resultado = matcherClave.find();
        return (!resultado);
    }

    public boolean verificarLongitudContraseña(String clave){
        return ( clave.length() >= 8 && clave.length() <= 20 );
    }

    public String cifrarContraseña(String contraseña){
        return BCrypt.hashpw(contraseña, BCrypt.gensalt());
    }

    public String verificarContraseña(String antiguaContraseña, String contraseña){
        if (BCrypt.checkpw(contraseña, antiguaContraseña)){
            return ("");
        }
        else{
            return ("La contraseña anterior no coincide con la almacenada. Inténtelo de nuevo.");
        }
    }

    static final Comparator<Usuario> NOMBRE_ORDEN =
                                 new Comparator<Usuario>() {
        public int compare(Usuario u1, Usuario u2) {
            return (u1.getNombre().
                    compareTo(u2.getNombre()));
        }
    };
}
